package com.qf.service.impl;

import com.qf.api.CacheFeign;
import com.qf.constant.CacheConstants;
import com.qf.constant.OperatorConstants;
import com.qf.model.StandardSubmit;
import com.qf.service.FilterChainService;
import com.qf.util.CheckMobileOperator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 *  1  号段补全策略
 * @author WuZiYu
 * @date 2022-6-7 下午 7:11
 */
@Service("phase")//自定义Bean对象的Id  <bean id="phase" class=....
@Slf4j
public class PhaseFilterChainServiceImpl implements FilterChainService {

    @Autowired
    private CacheFeign cacheFeign;
    /**
     * 号段补全策略
     * @param standardSubmit
     * @return
     */
    @Override
    public boolean strategy(StandardSubmit standardSubmit) {
        log.info("[策略模块 - 号段补全策略] 策略开始执行");
        Integer clientID = standardSubmit.getClientID();

        //如果失败了  false 发消息给消息队列
        //1 号段补全-1  判断手机号所有省及市
        String destMobile = standardSubmit.getDestMobile();
        //需要手机号前七位
        String phaseMobile = destMobile.substring(0, 7);//0开始  到第七位  不包括7（角标）
        System.out.println("手机前七位："+phaseMobile);
        String value = cacheFeign.get(CacheConstants.CACHE_PREFIX_PHASE + phaseMobile);
        if (StringUtils.isEmpty(value)){
            //省
            standardSubmit.setProvinceId(0);
            //市
            standardSubmit.setCityId(0);
        }else {
            String[] pc = value.split(",");
            //省
            standardSubmit.setProvinceId(Integer.parseInt(pc[0]));
            //市
            standardSubmit.setCityId(Integer.parseInt(pc[1]));
        }
        //2:号段补全-2  运营商     0 - 未知,1 - 移动, 2 - 联通 ,3 - 电信
        /**
         * 运营商     0 - 未知,1 - 移动, 2 - 联通 ,3 - 电信
         */
        //判断手机号是哪个运营商的    11位手机号是可以判断出是哪个运营商
        //是否联通
        if (CheckMobileOperator.isChinaUnicomPhoneNum(destMobile)){
            //是联通
            standardSubmit.setOperatorId(OperatorConstants.CHINA_UNICOM);//通道类型

            standardSubmit.setGatewayID(OperatorConstants.CHINA_UNICOM);//通道ID
        }else if (CheckMobileOperator.isChinaMobilePhoneNum(destMobile)){//是否移动
            standardSubmit.setOperatorId(OperatorConstants.CHINA_MOBILE);//通道类型

            standardSubmit.setGatewayID(OperatorConstants.CHINA_MOBILE);//通道ID
        }else if (CheckMobileOperator.isChinaTelecomPhoneNum(destMobile)){//是否电信
            standardSubmit.setOperatorId(OperatorConstants.CHINA_TELECOM);//通道类型

            standardSubmit.setGatewayID(OperatorConstants.CHINA_TELECOM);//通道ID
        }else{
            //未知
            standardSubmit.setOperatorId(OperatorConstants.CHINA_UNKNOWN);//通道类型

            standardSubmit.setGatewayID(4);//通道ID
        }
        //3: 号段补全-3
        /**
         * 下发网关ID号   1   （通道ID）
         */
        //private Integer gatewayID;     //  当可以发送短信后,指定网关的id,不同的网关对接不同的运营商,号段补全策略实现
        //4:号段补全-4
        /**
         * 下发的源号码
         *   10698888888    1069777777
         *   号段补全策略实现
         *   需要使用spNumber（channel表） + extendNumber（client_channel表）
         */
        //private String srcNumber;     // 号段补全
        /**
         * 重大发现：  缓存中存放Mysql数据库
         *   t_client_channel 表：  ROUTER:clientId:channelId  从源代码角度是正确的
         *   t_channel 表  ：  CHANNEL:channelType:id  从源代码角度是正确的
         */
        //3.1 extendNumber（client_channel表）
        Map routerMap = cacheFeign.hMGet(CacheConstants.CACHE_PREFIX_ROUTER + clientID + ":" + standardSubmit.getGatewayID());
        //3.2 spNumber（channel表）
        Map channelMap = cacheFeign.hMGet(CacheConstants.CACHE_PREFIX_SMS_CHANNEL + standardSubmit.getOperatorId() + "+" + standardSubmit.getGatewayID());
        String extendNumber = String.valueOf(routerMap.get("extendNumber"));
        String spNumber = String.valueOf(channelMap.get("spNumber"));
        if (!StringUtils.isEmpty(extendNumber)&&!StringUtils.isEmpty(spNumber)){

            standardSubmit.setSrcNumber(spNumber+extendNumber);
        }

        //本次短信费用
        standardSubmit.setFee(Long.parseLong(String.valueOf(routerMap.get("price"))));

        //模块名称   功能名称   失败或成功
        log.info("[策略模块 - 号段补全策略] 策略执行成功!");
        return true;
    }
}
